#include <string>
#include <unordered_map>
using namespace std;

/*
 Symbol Value
 I      1
 V      5
 X      10
 L      50
 C      100
 D      500
 M      1000

 一般规则：编写罗马数字的时候，要遵循从左向右、从大到小的规则，执行加法。
 VI = 5 + 1 = 6
 XV = 10 + 5 = 15

 特殊规则：执行减法的规则（6 种）
 IV = 4   / IX = 9
 XL = 40  / XC = 90
 CD = 400 / CM = 900

 M CM XC IV = 1000 + 900 + 90 + 4 

 编写一个函数，让它接受一个罗马数字，返回对应的阿拉伯数字。
 我们可以假设输入的罗马数字一定是正确的。
 */

int romanToInt(const string &r) {
  unordered_map<string, int> dic {
    {"I", 1},
    {"V", 5},
    // ...
    {"IV", 4}
  };
  //        v
  //  MCMXCXX
  int result = 0;
  for (int pos = 0; pos < r.size() - 1; ++pos) {
    // 如果 pos 和 pos + 1 这两个位置的字符是组合
    string tmp = r.substr(pos, 2);

    // tmp 是不是在 dic 里？
    if (dic.find(tmp) == dic.end()) {
      // tmp 不在 dic 里
      string s{r[pos]};
      result += dic[s];
    }
    else {
      // tmp 在 dic 里
      result += dic[tmp];
      ++pos;
    }
  }

  // 检查一下最后两个字符是不是特殊组合
  // 如果是特殊组合，直接返回
  // 如果不是特殊组合，单独加上最后一个罗马数字代表的数值
}
